﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

using System.Data.OleDb;
using System.IO;
using System.Data;

namespace gini
{
	/// <summary>
	/// Description of MainForm.
	/// </summary>
	public partial class MainForm : Form
	{
		OleDbConnection baglanti;
    
		OleDbDataAdapter adaptor;
    
		DataSet ds = new DataSet();
		
		int egitimIlk = 0;
		
		int egitimOrtaYuksek = 0;
		
		int egitimIlkEvet = 0;
		
		int egitimIlkHayir = 0;
		
		int egitimOrtaYuksekEvet = 0;
		
		int egitimOrtaYuksekHayir = 0;
		
		/*****************************/
    
		int yasGenc = 0;
		
		int yasOrtaYasli = 0;
		
		int yasGencEvet = 0;
		
		int yasGencHayir = 0;
		
		int yasOrtaYasliEvet = 0;
		
		int yasOrtaYasliHayir = 0;
		
		/*****************************/
		
		int cinsiyetErkek = 0;
		
		int cinsiyetKadin = 0;
		
		int cinsiyetErkekEvet = 0;
		
		int cinsiyetErkekHayir = 0;
		
		int cinsiyetKadinEvet = 0;
		
		int cinsiyetKadinHayir = 0;
		
		/*****************************/
		
		double giniEgitim = 0.0;
		
		double giniYas = 0.0;
		
		double giniCinsiyet = 0.0;
		
		public MainForm()
		{
			InitializeComponent();
			
			Veritabanina_Baglan();
		}
		
		public void Veritabanina_Baglan()
		{
			baglanti = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Application.StartupPath + "/gini.mdb");
            
			baglanti.Open();
            
			egitimIlk = Tablodan_Degerleri_Getir("egitim", "ilk", "", "", "", lblEgitimIlk);
			
			egitimOrtaYuksek = Tablodan_Degerleri_Getir("egitim", "orta", "yuksek", "", "", lblEgitimOrtaYuksek);
			
			egitimIlkEvet = Tablodan_Degerleri_Getir("egitim", "ilk", "", "kabul", "evet", lblEgitimIlkEvet);
			
			egitimIlkHayir = Tablodan_Degerleri_Getir("egitim", "ilk", "", "kabul", "hayir", lblEgitimIlkHayir);
			
			egitimOrtaYuksekEvet = Tablodan_Degerleri_Getir("egitim", "orta", "yuksek", "kabul", "evet", lblEgitimOrtaYuksekEvet);
			
			egitimOrtaYuksekHayir = Tablodan_Degerleri_Getir("egitim", "orta", "yuksek", "kabul", "hayir", lblEgitimOrtaYuksekHayir);
			
			/**************************************************************************************************************************/
			
			yasGenc = Tablodan_Degerleri_Getir("yas", "genc", "", "", "", lblYasGenc);
			
			yasOrtaYasli = Tablodan_Degerleri_Getir("yas", "orta", "yasli", "", "", lblYasOrtaYasli);
			
			yasGencEvet = Tablodan_Degerleri_Getir("yas", "genc", "", "kabul", "evet", lblYasGencEvet);
			
			yasGencHayir = Tablodan_Degerleri_Getir("yas", "genc", "", "kabul", "hayir", lblYasGencHayir);
			
			yasOrtaYasliEvet = Tablodan_Degerleri_Getir("yas", "orta", "yasli", "kabul", "evet", lblYasOrtaYasliEvet);
			
			yasOrtaYasliHayir = Tablodan_Degerleri_Getir("yas", "orta", "yasli", "kabul", "hayir", lblYasOrtaYasliHayir);
			
			/**************************************************************************************************************************/
			
			cinsiyetErkek = Tablodan_Degerleri_Getir("cinsiyet", "erkek", "", "", "", lblCinsiyetErkek);
			
			cinsiyetKadin = Tablodan_Degerleri_Getir("cinsiyet", "kadin", "", "", "", lblCinsiyetKadin);
			
			cinsiyetErkekEvet = Tablodan_Degerleri_Getir("cinsiyet", "erkek", "", "kabul", "evet", lblCinsiyetErkekEvet);
			
			cinsiyetErkekHayir = Tablodan_Degerleri_Getir("cinsiyet", "erkek", "", "kabul", "hayir", lblCinsiyetErkekHayir);
			
			cinsiyetKadinEvet = Tablodan_Degerleri_Getir("cinsiyet", "kadin", "", "kabul", "evet", lblCinsiyetKadinEvet);
			
			cinsiyetKadinHayir = Tablodan_Degerleri_Getir("cinsiyet", "kadin", "", "kabul", "hayir", lblCinsiyetKadinHayir);
					
			/**************************************************************************************************************************/
			
			// MessageBox.Show("Eğitim ilk evet: " + egitimIlkEvet.ToString());
			
			giniEgitim = Gini_J(Gini_Bul(egitimIlkEvet, egitimIlkHayir), Gini_Bul(egitimOrtaYuksekEvet, egitimOrtaYuksekHayir), egitimIlk, egitimOrtaYuksek, lblEgitimGini);
			
			giniYas = Gini_J(Gini_Bul(yasGencEvet, yasGencHayir), Gini_Bul(yasOrtaYasliEvet, yasOrtaYasliHayir), yasGenc, yasOrtaYasli, lblYasGini);
				
			giniCinsiyet = Gini_J(Gini_Bul(cinsiyetErkekEvet, cinsiyetErkekHayir), Gini_Bul(cinsiyetKadinEvet, cinsiyetKadinHayir), cinsiyetErkek, cinsiyetKadin, lblCinsiyetGini);
			
			/********En küçük gini'yi alalım*********************/
			
			Dallanma_Yap( giniEgitim, giniYas, giniCinsiyet);
			
            baglanti.Close();
		}
		
		public int Tablodan_Degerleri_Getir(string kolon1, string deger1, string deger2, string kolon2, string deger3, Label gosterilecek )
		{
			int satirSayisi = 0;
			
			string sorgu = "select * from tablo where ";
			
			if ( deger2 != "" )
			{
				sorgu += " (" + kolon1 + " = '" + deger1 + "' or "+ kolon1 + " = '" + deger2 + "' ";
			}
			else
			{
				sorgu += " (" + kolon1 + " = '" + deger1 + "' ";
			}
			
			sorgu += ") ";
			
			if ( kolon2 != "" )
			{
				sorgu += "and " + kolon2 + " = '" + deger3 + "' ";
			}
			
			adaptor = new OleDbDataAdapter(sorgu, baglanti);
            
            adaptor.Fill(ds);			
            
            dg.DataSource = ds;
            	
            satirSayisi = ds.Tables[0].Rows.Count;
            
            gosterilecek.Text = satirSayisi.ToString();
            	
            ds.Clear();
            
            return satirSayisi;
		}
		
		public double Gini_Bul(double evet, double hayir)
		{
			return (1 - ( Math.Pow( evet / (evet + hayir), 2 ) + Math.Pow( hayir / (evet + hayir), 2 ) ));
		}
		
		public double Gini_J(double giniSol, double giniSag, double toplam1, double toplam2, Label lblSonuc)
		{
			double sonuc = ( toplam1 * giniSol + toplam2 * giniSag ) / ( toplam1 + toplam2 );
		
			//MessageBox.Show("GiniSol: " + giniSol.ToString()  + " - Ginisağ " + giniSag.ToString());
			
			lblSonuc.Text = sonuc.ToString();
			
			return sonuc;
		}
		
		public void Dallanma_Yap( double gini1, double gini2, double gini3 )
		{
			//int dal1 = 0, dal2 = 0;
			
			double minimum = Math.Min( gini1, gini2);
			
			minimum = Math.Min( minimum, gini3);
			// Cinsiyete özel
			if( minimum == gini3 )
			{
				MessageBox.Show("Cinsiyettir");
			}
			// Yaş'a özel bir sorgu
			else if( minimum == gini2 )
			{
				MessageBox.Show("Yaştır");
				
				// Genç olana göre dallanma olacak
				if( yasGencEvet == yasGenc )
				{
					lbKurallar.Items.Add("Eğer yaş = genç ise kabul evettir");
				}
				else if( yasGencHayir == yasGenc )
				{
					lbKurallar.Items.Add("Eğer yaş = genç ise kabul hayırdır");
				}
				
				// Orta ve yaşlı olana göre dallanma olacak
				if( yasOrtaYasliEvet == yasOrtaYasli )
				{
					lbKurallar.Items.Add("Eğer yaş = orta veya yaş = yaşlı ise kabul evettir");
				}
				else if( yasOrtaYasliEvet == yasOrtaYasli )
				{
					lbKurallar.Items.Add("Eğer yaş = orta veya yaş = yaşlı ise kabul hayırdır");
				}
				else
				{
					
				}
			}
			// Eğitime özel
			if( minimum == gini1 )
			{
				MessageBox.Show("Eğitimdir");
			}
		}
	}
}